//
//  FXCompose.swift
//  微博(Swift)
//
//  Created by V on 16/1/4.
//  Copyright © 2016年 V. All rights reserved.
//

import UIKit

import pop



class FXCompose: UIView {
    
    
    // 声明一个属性：用于弹出控制器的目标控制器
    var target: UIViewController?
    
    
    
    

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    
    
    // MARK: - 懒加载
    private lazy var sloganImage: UIImageView = UIImageView(image: UIImage(named: "compose_slogan"))
    // 存放撰写界面的 6 个button
    private lazy var childMenuButtons: [UIButton] = [UIButton]()
    
    
    
    
    
    private func setupUI(){
        frame.size = CGSize(width: SCREENW, height: SCREENH)
        let imageView = UIImageView(image: UIImage.getScreenShot().applyLightEffect())
        addSubview(imageView)
        // logo
        addSubview(sloganImage)
        // 添加约束
        imageView.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(self)
        }
        // logo约束
        sloganImage.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(self).offset(100)
            make.centerX.equalTo(self)
        }
        addChildButton()
    }
    
    
    
    
    // 点击屏幕磨砂界面消失
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for (index,button) in childMenuButtons.reverse().enumerate() {
            doAnimation(button, index: index, isUp: false)
        }
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.6 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
            self.removeFromSuperview()
        }
    }
    
    
    
    
    
    // MARK: - 添加 Button
    private func addChildButton(){
        let childButtonW: CGFloat = 80
        let childButtonH: CGFloat = 110
        // 每一个按钮之间的间距
        let childButtonMargin: CGFloat = (SCREENW - 3 * childButtonW) / 4
        // 读取 plist 文件路径
        let path = NSBundle.mainBundle().pathForResource("compose.plist", ofType: nil)
        // 把 plist 文件转为 Array
        let composeButtonMenuInfos = NSArray(contentsOfFile: path!)
        // 遍历 数据数组的内容
        for (i, value) in composeButtonMenuInfos!.enumerate(){
            let button = FXComposeMenuButton()
            
            // 添加点击事件
            button.addTarget(self, action: "childButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)
            
            let dict = value as! NSDictionary
            // 取出字典中的数据
            let iconName = dict["icon"] as! String
            let title = dict["title"] as! String
            button.setTitle(title, forState: .Normal)
            button.setImage(UIImage(named: iconName), forState: UIControlState.Normal)

            // 取到当前遍历的按钮的第 xx 行和 第 xx 列
            let col = i % 3
            let row = i / 3
            let childButtonX = CGFloat(col + 1) * childButtonMargin + CGFloat(col) * childButtonW
            let childButotnY = (childButtonH + childButtonMargin) * CGFloat(row) + SCREENH
            button.frame = CGRect(x: childButtonX, y: childButotnY, width: childButtonW, height: childButtonH)
            
            // 把创建的 BUtton 添加到数组中去，方便管理
            childMenuButtons.append(button)
            addSubview(button)
        }
    }
    
    
    // MARK: - 按钮点击事件
    @objc private func childButtonClick(button: UIButton){
        // 1. 当前点击的按钮执行放大
        // 2. 没有点击的按钮进行缩小
        // 3. 跳转控制器
        UIView.animateWithDuration(0.25, animations: { () -> Void in
            for value in self.childMenuButtons {
                value.alpha = 0.01
                if value == button {
                    // 放大
                    value.transform = CGAffineTransformMakeScale(1.5, 1.5)
                }else{
                    // 缩小
                    value.transform = CGAffineTransformMakeScale(0.2, 0.2)
                }
            }
            }) { (_) -> Void in
                // 当放大缩小后，需要执行的操作
                self.target?.presentViewController(FXNavigationController(rootViewController: FXComposeViewController()), animated: true, completion: { () -> Void in
                    self.removeFromSuperview()
                })
        }
    }
    
    
    // 抽取一个方法，如果那个控制器调用这个方法，就能够展示调用这个方法的控制器的view
    func show(target: UIViewController) {
        self.target = target
        // 这样写 就是吧弹出的控制器添加到了 window 上边。当代码执行完 addsubView的时候，程序已经把他添加到了window上，之所以没有执行动画，是因为添加到了当前 View 的后边，（动画其实是在添加上控制器后，才执行的一个动画过程）
        // let window = UIApplication.sharedApplication().keyWindow
        // window?.addSubview(self)
        self.target?.view.addSubview(self)
    }
    
    
    
    
    // 当前控件被移动到 window 上边时候调用的方法
    override func didMoveToWindow() {
        for (index,button) in childMenuButtons.enumerate() {
            doAnimation(button, index: index)
        }
    }
    
    
    
    // 使用 POP 执行动画
    private func doAnimation(button: UIButton,index: Int, isUp: Bool = true){
        // 1. 设置要执行的动画类型
        let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
        // 2. 设置执行动画的 路径
        var y = button.center.y + 350
        if isUp {
            y = button.center.y - 350
        }
        animation.toValue = NSValue(CGPoint: CGPoint(x: button.center.x, y: y))
        // 3. 设置需要的属性
        animation.beginTime = CACurrentMediaTime() + Double(index) * 0.025
        // 弹性度：[0,20]，越大，幅度越大
        animation.springBounciness = 10
        // 弹性速度：[0,20] 越小，执行的时候时间越长
        animation.springSpeed = 8

        // 4. 添加动画
        button.pop_addAnimation(animation, forKey: nil)
        
    }
    
    
    
    
    
}

